#ifndef __BSP_H__
#define __BSP_H__

#include <stdint.h>      // IWYU pragma: export

#define ADC_IRQ_PRIORITY 1
#define HALL_IRQ_PRIORITY 1
#define PWM_BRAKE_IRQ_PRIORITY 1
#define TIMER_UP_IRQ_PRIORITY 2
#define ENC_TIMER_IRQ_PRIORITY 2
#define ENC_PWM_IRQ_PRIORITY 2
#define SCHED_TIMER_IRQ_PRIORITY 3
#define ENC_I_EXIT_IRQ_PRIORITY 4
#define CAN_IRQ_PRIORITY       5
#define UART_IRQ_PRIORITY      5 
#define RTC_IRQ_PRIORITY       6
#define ENC_OTHER_IRQ_PRIORITY 7
#define SYSTICK_IRQ_PRIOTIRY   15

#define CONFIG_GPIO_HIGH_BRK_MODE 1
#define CONFIG_GPIO_LOW_BRK_MODE 2

#define CONFIG_ENCODER_MPS 1
#define CONFIG_ENCODER_MT  2
#define CONFIG_ENCODER_AMS 3

#define MOTOR_BLUESHARK_NEW1    1//蓝鲨大功率电机，双I形
#define MOTOR_BLUESHARK_NEW2    2//蓝鲨大功率电机，V形
#define MOTOR_BLUESHARK_OLD     3//目前量产的电机
#define MOTOR_BLUESHARK_ZD_100  4//中动100码编码器电机样品
#define MOTOR_BLUESHARK_A1      5

#define CONFIG_HW_ID_UART0  0x0
#define CONFIG_HW_ID_CAN0   0x10

#define ENCODER_TIMER_DIR_DOWN 1
#define ENCODER_TIMER_DIR_UP 2

#define get_uart_id(HW) (HW&0X0f)

#if defined(STM32F405xx)
#include "bsp/stm32/stm32f4xx_board.h" // IWYU pragma: export
#elif defined(STM32G431xx)
#include "bsp/stm32/stm32g4x1_board.h" // IWYU pragma: export
#elif defined (GD32F30X_HD) || defined (GD32F30X_XD) || defined (GD32F30X_CL)
#include "bsp/gd32/gd32f30x_board.h"
#elif defined(USE_MEX_CMD)
#include "simulink_sfunc/sim_bsp.h"  // IWYU pragma: export
#endif

#include "bsp/cpu_ticks.h"

/* dq轴电流环解耦是否开启，如果有比较准确的电机相电感，相电阻，永磁磁链参数，可以打开 */
#ifndef CONFIG_CURRENT_LOOP_DECOUPE
#define CONFIG_CURRENT_LOOP_DECOUPE 0
#endif

/* 相电流采样，采集哪两个相 */
#ifndef CONFIG_PHASE_CURRENT_PHASE_AB
#define CONFIG_PHASE_CURRENT_PHASE_AB 0
#endif
#ifndef CONFIG_PHASE_CURRENT_PHASE_AC
#define CONFIG_PHASE_CURRENT_PHASE_AC 0
#endif
#ifndef CONFIG_PHASE_CURRENT_PHASE_BC
#define CONFIG_PHASE_CURRENT_PHASE_BC 0
#endif

/* 相电流采样极性，是取反还是正, 取决硬件采样电路 (1/-1) */
#ifndef CONFIG_CURRENT_POLARITY
#define CONFIG_CURRENT_POLARITY 1
#endif

/* 如果没有母线电流的硬件采样，必须打开软件的计算 */
#if (!CONFIG_DC_CURR_SAMPLE)
#undef CONFIG_DC_CURR_CALC
#define CONFIG_DC_CURR_CALC 1
#endif

/* 编码器的方向和电机转动方向是否一致 */
#ifndef CONFIG_ENCODER_CC_INVERT
#define CONFIG_ENCODER_CC_INVERT 0
#endif

/* 编码器是否使用abi接口的编码器,可以配合pwm或者spi定位初始位置 */
#ifndef CONFIG_ENCODER_ABI
#define CONFIG_ENCODER_ABI 0
#endif

/* 编码器是否使用abs接口的编码器(spi/i2c接口),使用最简单，但是需要考虑i2c/spi的传输问题 */
#ifndef CONFIG_ENCODER_ABS
#define CONFIG_ENCODER_ABS 0
#endif

/* 默认转把供电电压为5v */
#ifndef CONFIG_THROTTLE_VOLTAGE
#define CONFIG_THROTTLE_VOLTAGE 5.0f
#endif

/* 串口驱动的收发缓存大小 */
#ifndef CONFIG_UART_TX_BUFFER_SIZE
#define CONFIG_UART_TX_BUFFER_SIZE 4096
#endif
#ifndef CONFIG_UART_RX_BUFFER_SIZE
#define CONFIG_UART_RX_BUFFER_SIZE 512
#endif

/* 某些电路有比较大的滤波系数，判断错误从开机后延时这个时间开始 */
#ifndef CONFIG_IGNORE_ERROR_MS
#define CONFIG_IGNORE_ERROR_MS 500
#endif

#ifndef CONFIG_BOARD_COM_UART
#define CONFIG_BOARD_COM_UART 0
#endif

#ifndef CONFIG_BOARD_COM_CAN
#define CONFIG_BOARD_COM_CAN 0
#endif

#endif /* __BSP_H__ */
